home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1996 May: Tool Chest / Developer CD Series May 1996 (Tool Chest) (Apple Computer) (1996).iso / Sample Code / Snippets / Sound / BufCallback / BufferPlay.c next >
Encoding:
C/C++ Source or Header  |  1995-02-11  |  5.9 KB  |  257 lines  |  [TEXT/MPS ]

  1. /*______________________________________________________*/
  2. /*                            C Shell                        */
  3. /*                          by                          */
  4. /*                  RICHARD P. COLLYER                  */
  5. /*                       10/14/91                       */
  6. /*______________________________________________________*/
  7.  
  8. #include    <Quickdraw.h>
  9. #include    <Windows.h>
  10. #include    <desk.h>
  11. #include    <Memory.h>
  12. #include    <Menus.h>
  13. #include    <OSEvents.h>
  14. #include    <Resources.h>
  15. #include    <SegLoad.h>
  16. #include    <Sound.h>
  17. #include    <ToolUtils.h>
  18.  
  19. extern _DataInit();
  20.  
  21. #define    TRUE            0xFF
  22. #define    FALSE            0
  23.  
  24. #define    appleID            128            
  25. #define    appleMenu        0
  26. #define    aboutMeCommand    1
  27.  
  28. #define    fileID            129
  29. #define    startCommand    1
  30. #define printCommand    3
  31. #define    quitCommand     5
  32.  
  33. #define    editID            130
  34.  
  35. int                    yieldTime, err;
  36. MenuHandle            mymenu1, mymenu2, mymenu0;
  37. EventRecord         myEvent;
  38. Boolean                DoneFlag;
  39. WindowPtr            whichWindow;
  40. short                GlobalFlag;
  41.  
  42. #ifdef powerc
  43.    QDGlobals    qd;
  44. #endif
  45.  
  46. /*______________________________________________________*/
  47. /*                What ever You want                    */
  48. /*______________________________________________________*/
  49. pascal void CallBack(SndChannelPtr chan, SndCommand cmd)
  50. {
  51.   #ifndef powerc
  52.       long    myA5;
  53.       myA5 = SetA5 (cmd.param2);
  54.   #endif
  55.     
  56.     GlobalFlag = TRUE;
  57.    
  58.    #ifndef powerc
  59.       myA5 = SetA5 (myA5);
  60.    #endif
  61.  
  62.     return;
  63. }
  64.     
  65. /*______________________________________________________*/
  66. /*                What ever You want                    */
  67. /*______________________________________________________*/
  68. void start()
  69. {
  70.     Handle            Sound;
  71.     SndChannelPtr    chan;
  72.     SndCommand        mycmd;
  73.     SndCallBackUPP  myCallBackUPP;
  74.     
  75.     GlobalFlag = FALSE;
  76.     
  77.     Sound = GetResource ('snd ', 100);
  78.     if (ResError() != noErr || Sound == nil)
  79.         Debugger();
  80.         
  81.     /* create a UPP for our sound callback */
  82.     myCallBackUPP = NewSndCallBackProc(CallBack);
  83.     
  84.     chan = nil;
  85.     err = SndNewChannel (&chan, sampledSynth, initNoInterp + initMono, myCallBackUPP);
  86.     if (err != noErr)
  87.         Debugger();
  88.     
  89.     do {
  90.         mycmd.cmd = bufferCmd;
  91.         mycmd.param1 = 0;
  92.         mycmd.param2 = (long) *Sound;
  93.         err = SndDoCommand (chan, &mycmd, FALSE);
  94.         if (err != noErr)
  95.             Debugger();
  96.         
  97.         mycmd.cmd = callBackCmd;
  98.         mycmd.param1 = 0;
  99.         mycmd.param2 = SetCurrentA5();
  100.         err = SndDoCommand (chan, &mycmd, FALSE);
  101.         if (err != noErr)
  102.             Debugger();
  103.         
  104.         do{
  105.             }while (GlobalFlag == FALSE);
  106.  
  107.         GlobalFlag = FALSE;
  108.  
  109.         } while (!Button());
  110.         
  111.     err = SndDisposeChannel (chan,FALSE);
  112.     if (err != noErr)
  113.         Debugger();
  114.         
  115.     DisposeRoutineDescriptor(myCallBackUPP);
  116.  
  117.     return;
  118. }
  119.  
  120. /*______________________________________________________*/
  121. /*                 About Prog Dialog                    */
  122. /*______________________________________________________*/
  123. void showAboutMeDialog()
  124. {
  125.     return;
  126. }
  127.  
  128. /*______________________________________________________*/
  129. /*                 Do Menu Function                     */
  130. /*______________________________________________________*/
  131. void doCommand(mResult)
  132.     long    mResult;
  133. {
  134.     int                     theMenu, theItem;
  135.     char                    daName[256];
  136.     GrafPtr                 savePort;
  137.  
  138.     theItem = LoWord(mResult);
  139.     theMenu = HiWord(mResult);
  140.     
  141.     switch (theMenu) {
  142. /*______________________________________________________*/
  143. /*                    Do Apple Menu                     */
  144. /*______________________________________________________*/
  145.         case appleID:
  146.             if (theItem == aboutMeCommand)
  147.                 showAboutMeDialog();
  148.             else {
  149.                 GetMenuItemText(mymenu0, theItem, daName);
  150.                 GetPort(&savePort);
  151.                 (void) OpenDeskAcc(daName);
  152.                 SetPort(savePort);
  153.             }
  154.             break;
  155. /*______________________________________________________*/
  156. /*                     Do File Menu                     */
  157. /*______________________________________________________*/
  158.         case fileID:
  159.             switch (theItem) {
  160.                 case startCommand:
  161.                     start();
  162.                     break;
  163.                 case printCommand:
  164.                     break;
  165.                 case quitCommand:
  166.                     DoneFlag = TRUE;
  167.                     break;
  168.                 default:
  169.                     break;
  170.                 }
  171.             break;
  172. /*______________________________________________________*/
  173. /*                     Do Edit Menu                     */
  174. /*______________________________________________________*/
  175.         case editID:
  176.             switch (theItem) {
  177.                 default:
  178.                     break;
  179.                 }
  180.             break;
  181.         default:
  182.             break;
  183.         }
  184.     HiliteMenu(0);
  185.     return;
  186. }
  187.  
  188. /*______________________________________________________*/
  189. /*               Initialization traps                   */
  190. /*______________________________________________________*/
  191. void init()
  192. {
  193.     UnloadSeg(_DataInit);
  194.     InitGraf(&qd.thePort);
  195.     FlushEvents(everyEvent, 0);
  196.     InitMenus();
  197.     InitCursor();
  198.     MaxApplZone();
  199. /*______________________________________________________*/
  200. /*                    Set menus                         */
  201. /*______________________________________________________*/
  202.     mymenu0 = GetMenu(appleID);
  203.     AppendResMenu(mymenu0, 'DRVR');
  204.     InsertMenu(mymenu0,0);
  205.     mymenu1 = newmenu(129,"File");
  206.     appendmenu(mymenu1,"Start;-;Print;-;Quit");
  207.     InsertMenu(mymenu1,0);
  208.     mymenu2 = newmenu(130,"Edit");
  209.     InsertMenu(mymenu2,0);
  210.     DrawMenuBar();
  211.  
  212. /*______________________________________________________*/
  213. /*                  Init variables                      */
  214. /*______________________________________________________*/
  215.     DoneFlag = FALSE;
  216.     yieldTime = 0;
  217.     return;
  218. }
  219.  
  220. main()
  221. {
  222. /*______________________________________________________*/
  223. /*                   Main Event loop                    */
  224. /*______________________________________________________*/
  225.     init();
  226.     for ( ;; ) {
  227.         if (DoneFlag) {
  228.             ExitToShell();
  229.             }
  230.         if (WaitNextEvent(everyEvent, &myEvent, yieldTime, nil)) {
  231.             switch (myEvent.what) {
  232.                 case mouseDown:
  233.                     switch (FindWindow(myEvent.where, &whichWindow)) {
  234.                         case inSysWindow:
  235.                             SystemClick(&myEvent, whichWindow);
  236.                             break;
  237.                         case inMenuBar:
  238.                             doCommand(MenuSelect(myEvent.where));
  239.                             break;
  240.                         default:
  241.                             break;
  242.                         }
  243.                     break;
  244.                 case app4Evt:
  245.                     if ((myEvent.message << 31) == 0) { /* Suspend */
  246.                         yieldTime = 30;
  247.                         }
  248.                     else { /* Resume */
  249.                         yieldTime = 0;
  250.                         }
  251.                     break;
  252.                 default:
  253.                     break;
  254.                 }
  255.             }
  256.         }
  257. }